# Specific specs passed
.specs-specified: &specs-specified
  if: $QA_TESTS != ""

# No specific specs passed
.all-specs: &all-specs
  if: $QA_TESTS == ""

# FF changes
.feature-flags-set: &feature-flags-set
  if: $QA_FEATURE_FLAGS =~ /enabled|disabled/

# Specific specs specified
.spec-file-specified: &spec-file-specified
  if: $QA_TESTS =~ /_spec\.rb/

# Specs directory specified
.spec-directory-specified: &spec-directory-specified
  if: $QA_TESTS != "" && $QA_TESTS !~ /_spec\.rb/

# Manually trigger job on ff changes but with default ff state instead of inverted
.feature-flags-set-manual: &feature-flags-set-manual
  <<: *feature-flags-set
  when: manual
  allow_failure: true

# Run the job on master pipeline
.default-branch: &default-branch
  if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'

# Run all tests when QA framework changes present, full suite execution is explicitly enabled or a feature flag file is removed
.qa-run-all-tests: &qa-run-all-tests
  if: $QA_FRAMEWORK_CHANGES == "true" || $QA_RUN_ALL_TESTS == "true" || $QA_RUN_ALL_E2E_LABEL == "true" || $QA_FEATURE_FLAGS =~ /deleted/

# Run job when MR has pipeline:run-all-e2e label
.qa-run-all-e2e-label: &qa-run-all-e2e-label
  if: $QA_RUN_ALL_E2E_LABEL == "true"

# Process test results (notify failure to slack, create test session report, relate test failures)
.process-test-results: &process-test-results
  if: $PROCESS_TEST_RESULTS == "true"

.not-canonical-project: &not-canonical-project
  if: '$CI_PROJECT_PATH != "gitlab-org/gitlab" && $CI_PROJECT_PATH != "gitlab-cn/gitlab"'

# Selective test execution against omnibus instance have following execution scenarios:
#   * only e2e spec files changed - runs only changed specs
#   * qa framework changes - runs full test suite
#   * feature flag changed - runs full test suite with base gitlab instance configuration with both ff states
#   * quarantined e2e spec - skips execution of e2e tests by creating a no-op pipeline

# ------------------------------------------
# Prepare
# ------------------------------------------
.rules:prepare:
  rules:
    - when: always

.rules:update-cache:
  rules:
    - if: '$UPDATE_QA_CACHE == "true"'

.rules:download-knapsack:
  rules:
    - when: always

.rules:download-fast-quarantine-report:
  rules:
    - when: always

# ------------------------------------------
# Test
# ------------------------------------------
.rules:test:manual:
  rules:
    - when: manual
      allow_failure: true
      variables:
        QA_TESTS: ""

.rules:test:feature-flags-set:
  rules:
    # unset specific specs if pipeline has feature flag changes and run full suite
    - <<: *feature-flags-set
      variables:
        QA_TESTS: ""

# parallel and non parallel rules are used for jobs that require parallel execution and thus need to switch
# between parallel and non parallel when only certain specs are executed
.rules:test:qa-selective:
  rules:
    # always run parallel with full suite when framework changes present or ff state changed
    - <<: *qa-run-all-tests
      when: never
    - <<: *all-specs
      when: never
    - <<: *feature-flags-set
      when: never
    - <<: *spec-directory-specified
      when: never

.rules:test:qa-selective-parallel:
  rules:
    # always run parallel with full suite when framework changes present or ff state changed
    - <<: *qa-run-all-tests
      when: never
    - <<: *all-specs
      when: never
    - <<: *feature-flags-set
      when: never
    - <<: *spec-file-specified
      when: never

.rules:test:qa-parallel:
  rules:
    - *qa-run-all-tests
    - <<: *specs-specified
      when: manual
      allow_failure: true
      variables:
        QA_TESTS: ""
    - *feature-flags-set-manual

# general qa job rule for jobs without the need to run in parallel
.rules:test:qa:
  rules:
    - *qa-run-all-tests
    - *feature-flags-set-manual

.rules:test:ce-only:
  rules:
    - if: $FOSS_ONLY != "1"
      when: never

.rules:test:ee-only:
  rules:
    - if: $FOSS_ONLY == "1"
      when: never

.rules:test:update:
  rules:
    # skip upgrade jobs if gitlab version is not in semver compatible format
    # these jobs need gitlab version because we can't reliably detect it from just the image
    - if: $GITLAB_SEMVER_VERSION !~ /^\d+\.\d+\.\d+/
      when: never
    # $QA_SUPER_SIDEBAR_ENABLED is now only present as a variable when testing old nav so we skip update jobs
    # in pipeline where it is explicitly disabled
    - if: $QA_SUPER_SIDEBAR_ENABLED
      when: never
    - !reference [.rules:test:qa, rules]

.rules:test:qa-default-branch:
  rules:
    - *qa-run-all-e2e-label
    - *default-branch
    - *feature-flags-set-manual

# ------------------------------------------
# Report
# ------------------------------------------
.rules:report:allure-report:
  rules:
    - if: $SKIP_ALLURE_REPORT == "true"
      when: never
    - when: always

.rules:report:process-results:
  rules:
    - <<: *not-canonical-project
      when: never
    - *process-test-results
